package jml.config.cmd;

import java.util.ArrayList;
import java.util.StringTokenizer;

public class CommandExec
{
	public static void exec(Command cmd)
	{
		try
		{
			ArrayList<String> args=new ArrayList<String>();

			// agrego el runtime script
			args.add(cmd.getRuntimeScript());

			// el comando puede ser un customscript o un ejecutable
			if(!cmd.isScript())
			{
				args.add(cmd.getDefaultScript());
			}
			else
			{
				args.add(cmd.getCmd());
			}

			// parseo los parametros
			pack(cmd);

			// paso los parametros
			for(String s:cmd.getParams())
			{
				args.add(s);
			}

			// ejecuto el comando
			ProcessBuilder pb=new ProcessBuilder(args);
			pb.start();
			
			System.out.println(args);

		}
		catch(Exception ex)
		{
			ex.printStackTrace();
			throw new RuntimeException(ex);
		}

	}

	// recorre los parametros reemplazando las variables
	private static void pack(Command cmd)
	{
		ArrayList<String> okParams=new ArrayList<String>();

		// recorro los parametros
		for(int i=0; i<cmd.getParams().size(); i++)
		{
			StringParser sp=new StringParser(cmd.getParams().get(i),"[$","]");
			String ok=sp.parse(new Listener(cmd));
			okParams.add(ok);
		}

		cmd.setParams(okParams);
	}

	static class Listener implements StringParseListener
	{
		Command cmd;

		public Listener(Command cmd)
		{
			this.cmd=cmd;
		}

		@Override
		public String changeToken(String oldToken)
		{
			String n=cmd.getProps().get(oldToken);
			if(n!=null)
			{
				return n;
			}
			else
			{
				n=cmd.getAppParams().get(oldToken);
				if(n!=null)
				{
					return n;
				}
				else
				{
					return cmd.getCmd();
				}
			}
		}
	}
}
